package com.zhoukx.netty.inboundhandlerAndOutboundhandler;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;

import java.nio.charset.Charset;

public class MyClientHandler extends SimpleChannelInboundHandler<Long> {
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, Long msg) throws Exception {

        //
        System.out.println("服务器IP="+ctx.channel().remoteAddress());
        System.out.println("收到服务器消息="+msg);
    }

    /**
     *  发送重写这个方法
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("MyClientHandler 发送数据");
        // 发送一个long
        ctx.writeAndFlush(123456L);
        //  分析
        //1."adbadbadbc" 是16个字节
        //2. handler 会被调用多次
        //3  该处理的前提个handler 是 MyLongToByteEncoder
        //4  MyLongTobteEncode 父类 MessageToByteEncoder
        /**
         *   if (acceptOutboundMessage(msg)) { 判断当前发送的数据类型是不是应该处理的类型,如果是就处理,不是就跳过encode
         *                 @SuppressWarnings("unchecked")
         *                 I cast = (I) msg;
         *                 buf = allocateBuffer(ctx, cast, preferDirect);
         *                 try {
         *                     encode(ctx, cast, buf);
         *                 } finally {
         *                     ReferenceCountUtil.release(cast);
         *                 }
         *
         *                 if (buf.isReadable()) {
         *                     ctx.write(buf, promise);
         *                 } else {
         *                     buf.release();
         *                     ctx.write(Unpooled.EMPTY_BUFFER, promise);
         *                 }
         *                 buf = null;
         *
         *
         *
         */
        // 因此 在编写Encoder时候要注意还如的类型和处理的数据要一致
       // ctx.writeAndFlush(Unpooled.copiedBuffer("abcdabcdabcd", CharsetUtil.UTF_8));
    }
}
